import {
  CallHandler,
  ExecutionContext,
  Injectable,
  NestInterceptor,
} from '@nestjs/common'
import { map, Observable } from 'rxjs'
import { HTTP_SUCCESS_CODE } from '@/util/exceptions'

export interface Response<T> {
  data: T
}

/**
 * Interceptor that transforms the response body
 * @description This interceptor is used to transform the response body
 */
@Injectable()
export class TransformInterceptor<T> implements NestInterceptor {
  /**
   * @description handle() ：可以使用它在拦截器中的某个点调用路由处理程序方法。
   * 如果在 intercept() 方法的实现中不调用 handle() 方法，则根本不会执行路由处理程序方法。
   */
  intercept(
    context: ExecutionContext,
    next: CallHandler,
  ): Observable<Response<T>> {
    // 可以在最终路由处理程序执行之前和之后实现自定义逻辑
    // ...

    return next.handle().pipe(
      map((data) => {
        return {
          data,
          code: HTTP_SUCCESS_CODE,
          message: 'success',
        }
      }),
    )
  }
}
